#include "include/Task.h"
#include <strings.h>
#include "include/login_client.h"

int main(int argc,char*argv[]){
    // ./client 127.0.0.1 6666
    ARGS_CHECK(argc, 3);

    // 1. 建立于服务端的连接
    int sockfd=InitTcpconnect(argv[1], argv[2]);
    printf("sockfd:%d\n",sockfd);

   
    // 2. 建立任务并进行初始化
    task_t *task=task_init(sockfd);

    // 3. 将标准输入以及sockfd加入监听
    int epfd=epoll_create(1);
    EpollAdd(epfd,  sockfd); 
    EpollAdd(epfd,  STDIN_FILENO);
    //未登录测试
    char username[1024]={"admin"};
    char password[1024]={"123"};
    char salt[1024]={0};

    accept_info_t userinfo;
    init_accept_info(&userinfo);
    userinfo.is_new=0;
    send(sockfd,&userinfo,sizeof(accept_info_t),0);
    // 3.1 测试客户端注册 + 3.2 测试客户端登录
    int login = login_or_register(username,password,task,salt);
    if(login == -1){
        printf("登录或注册失败\n");
        return -1;
    }

    // 3.3 接收服务器返回的密文
    memset(&userinfo,0,sizeof(accept_info_t));
    recv(sockfd,&userinfo,sizeof(accept_info_t),MSG_WAITALL);
    printf("userinfo.jwt:%s\n",userinfo.jwt);


    
    // 4. 创建就绪集合 
    struct epoll_event readyNum[1024];
    
    char buf[1024]={0};
    while(1){
        // 5. 等待监听就绪
        int Num=epoll_wait(epfd, readyNum, 1024, -1);
        for(int i=0;i<Num;i++){
            if(readyNum[i].data.fd==STDIN_FILENO){
               // 监听标准输入，将客户端输入的命令解析 
               bzero(buf, sizeof(buf));
               size_t readNum=read(STDIN_FILENO, buf, sizeof(buf));
               if(readNum<=0) 
               continue;
               // 去除末尾输入的换行符
               if(buf[readNum-1]=='\n'){
                  buf[readNum-1]='\0';
               }
               // 特殊情况 处理空输入
               if(strlen(buf)==0)
               continue;
                bzero(&task->_train,sizeof(task->_train));
                // 解析命令
                parseCommand(buf,task);
                CmdType cmdType=task->_train._cmdType;
                // 短命令发送命令
               if(cmdType!=CMD_TYPE_GETS&&cmdType!=CMD_TYPE_PUTS){
                send(sockfd, &task->_train, sizeof(task->_train), 0);
               }
               // 处理客户端上传
               printf("cmdType:%d\n",cmdType);
               if(cmdType==CMD_TYPE_PUTS||cmdType==CMD_TYPE_GETS){
                   printf("上传文件的名字:%s\n",task->_train._data);
                   //创建线程执行上传任务
                   // 与服务器重新建立连接
                   int temp_sockfd = temp_connect(argv[1],argv[2],&userinfo);
                   ERROR_CHECK(temp_sockfd,-1,"fail in temp_connect");
                   task->_netfd = temp_sockfd;
                   //发送gets或puts任务给服务器
                   send(temp_sockfd,&task->_train,sizeof(task->_train),0);
                   printf("task->_train._data:%s\n",task->_train._data);

                   pthread_t thread;
                   pthread_create(&thread,NULL,handle_puts,task);
                   //handle_puts(task);
               }
               // 处理客户端退出命令
                if(cmdType==CMD_TYPE_QUIT){
                     printf("client quit\n");
                     break;
               }
        }
           else if(readyNum[i].data.fd==sockfd){
                // 监听sockfd，接收服务器返回的数据
                bzero(&task->_train,sizeof(task->_train));
                //int num=recv(sockfd,&task->_train,sizeof(task->_train),0);
                //ERROR_CHECK(num,0,"fail in recv");
                CmdType cmd=task->_train._cmdType;
                if(cmd==CMD_TYPE_PWD){
                    //handle_pwd(task);
                }
                else if(cmd==CMD_TYPE_LS){
                    //handle_ls(task);
                }
                else if(cmd==CMD_TYPE_GETS){
                    //handle_gets(task);
                }
            }
    }
}
                return 0;
}
